在上一章節中,筆者解釋了該如何使用指令執行中的管線來重新導向到檔案中,以及將指令的輸出利用pipelines技巧變成後面的指令的輸入,最後介紹基本文字編輯器vim之使用方法,在這一章節中,將要介紹如何做到基本使用者與群組管理。
從簡單意思上來說,就是存取作業系統上的程式或是指令執行的人,就叫做使用者,使用者通常通常分成三種類型:超級使用者、系統使用者以及一般使用者。超級使用者意思是,這個使用者只有一個在系統上,為最高權限的使用者,就叫做root,更多詳細的root使用者介紹與使用,則會在後面的章節作介紹,系統使用者則是作業系統上的套件所建立的使用者,或是執行程序process的使用者,為了要執行某個程式或是套件所自動創立的,通常這類的使用者都不被允許登入,都只用來執行特定的程序prcoess或是套件,而一般使用者則是可以存取作業系統一般功能的使用者,通常可以登入進去之外,也可以做大部分非超級使用者權限的操作與指令。下列筆者使用id
這個指令可以查看目前使用者的名稱已經對應的id,當Linux作業系統將使用者建立的時候,若沒有指定的話,則會自動指派一個id給新增的使用者,相關的指令執行結果如下:
[rockylinux@workstation ~]$ id
uid=1000(rockylinux) gid=1000(rockylinux) groups=1000(rockylinux),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[rockylinux@workstation ~]$
從上面的執行指令結果可以知道,利用id
指令可以輸出所以有的使用者資訊,還有group資訊等,而利用ls -l
這個指令則可以查看目前使用者目錄的擁有者,相關的輸出如下:
[rockylinux@workstation ~]$ ls -l ~
total 8
drwxr-xr-x. 2 rockylinux rockylinux 6 Sep 18 00:05 Desktop
drwxr-xr-x. 2 rockylinux rockylinux 6 Sep 18 00:05 Documents
drwxr-xr-x. 2 rockylinux rockylinux 6 Sep 18 00:05 Downloads
-rw-rw-r--. 1 rockylinux rockylinux 81 Sep 23 00:36 home_list.txt
drwxr-xr-x. 2 rockylinux rockylinux 6 Sep 18 00:05 Music
drwxr-xr-x. 2 rockylinux rockylinux 4096 Sep 19 20:58 Pictures
drwxr-xr-x. 2 rockylinux rockylinux 6 Sep 18 00:05 Public
drwxr-xr-x. 2 rockylinux rockylinux 6 Sep 18 00:05 Templates
drwxr-xr-x. 2 rockylinux rockylinux 6 Sep 18 00:05 Videos
從上面的輸出訊息可以知道,從左邊過來的第一個rockylinux
是這個擁有這個檔案或是目錄權限的使用者,第二個則是擁有檔案與附錄權限的群組名稱,預設如果使用者沒有加入到群組,則預設的群組名稱為自己的的使用者名稱,接著可以使用ps -au
來查看是哪個使用者正在運行什麼程序process,相關的指令執行結果輸出如下:
[rockylinux@workstation ~]$ ps -au
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
gdm 1507 0.0 0.7 340368 13276 tty1 Ssl+ 23:10 0:00 /usr/libexec/gdm-wayland-session --regist
gdm 1752 0.0 0.9 732300 17076 tty1 Sl+ 23:10 0:00 /usr/libexec/gnome-session-binary --autos
gdm 1780 1.7 13.8 3169092 257556 tty1 Sl+ 23:10 0:09 /usr/bin/gnome-shell
gdm 1798 0.0 2.6 855868 48524 tty1 Sl+ 23:10 0:00 /usr/bin/Xwayland :1024 -rootless -termin
gdm 1822 0.0 0.6 389048 11300 tty1 Sl 23:10 0:00 ibus-daemon --xim --panel disable
gdm 1825 0.0 0.4 302808 8560 tty1 Sl 23:10 0:00 /usr/libexec/ibus-dconf
gdm 1828 0.0 3.3 1131200 62708 tty1 Sl 23:10 0:00 /usr/libexec/ibus-x11 --kill-daemon
gdm 1872 0.0 1.3 524216 25784 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-xsettings
gdm 1874 0.0 0.7 301636 14872 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-a11y-settings
gdm 1877 0.0 1.2 373376 23904 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-clipboard
gdm 1878 0.0 1.3 686912 25340 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-color
gdm 1880 0.0 0.8 384004 16244 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-datetime
gdm 1881 0.0 0.4 305936 7828 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-housekeeping
gdm 1882 0.0 1.3 523148 24240 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-keyboard
gdm 1887 0.0 1.4 1186416 27460 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-media-keys
gdm 1889 0.0 0.3 225632 7432 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-mouse
gdm 1891 0.0 1.3 547980 25968 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-power
gdm 1897 0.0 0.5 277640 9964 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-print-notifications
gdm 1901 0.0 0.4 230388 8208 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-rfkill
gdm 1904 0.0 0.4 299372 7596 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-screensaver-proxy
gdm 1908 0.0 0.4 307900 9080 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-sharing
gdm 1917 0.0 0.6 474480 12508 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-smartcard
gdm 1926 0.0 0.7 367188 13196 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-sound
gdm 1930 0.0 1.2 510144 24156 tty1 Sl+ 23:10 0:00 /usr/libexec/gsd-wacom
gdm 1988 0.0 0.4 229116 8312 tty1 Sl 23:10 0:00 /usr/libexec/ibus-engine-simple
rockyli+ 2104 0.0 0.3 25564 5612 pts/0 Ss 23:13 0:00 -bash
rockyli+ 2243 0.0 0.2 58728 4028 pts/0 R+ 23:19 0:00 ps -au
從上面的輸出訊息來看,可以看到有一個gdm
使用者執行了非常多的程序process,那這個gdm
使用者其實就是系統使用者,原因是這個使用者專門執行一些跟GNOME桌面環境有關的程序,因此這個使用者也是不會允許登入做使用的,為了驗證這件事情,可以使用cat /etc/passwd | grep gdm
這個指令來做到,這邊多了一個新的指令叫做grep
,grep
這個指令是用來找尋指定在標準輸入中的字串關鍵字或是特殊的字串形式用的,關於這個指令更多的用法語詳細介紹,會在之後的章節做說明,接著這個指令執行之後,會得到下列的結果:
[rockylinux@workstation ~]$ cat /etc/passwd | grep gdm
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
從/etc/passwd檔案中定義gdm
使用者不能夠登入,就可以驗證這個使用者是歸類為系統使用者。所有有關於使用者的一些資訊都會存放在/etc/passwd
檔案裡面,而群組的資訊則會存放在/etc/group
之檔案裡,每一個資訊都會以冒號來隔開,像以gdm:x:42:42::/var/lib/gdm:/sbin/nologin
這個為例,此使用者從左至右解讀的資訊如下:
gdm
指的是使用者名稱。x
是使用者已經做過雜湊之後並存放到/etc/shadow之檔案裏面,所以這邊欄位永遠都會顯示成x
。42
指的是user使用者之id,這是給作業系統看的。42
指的是group群組的id,這是給作業統看的。/var/lib/gdm
指的是這個使用者的家目錄,也是當shell啟動的時候一開始會切換到的工作目錄。/sbin/login
指的是預設啟動的shell,因為gdm
是被作業系統指定為系統使用者,因此這邊不被允許登入shell,因此顯示成/sbin/nologin,不被允許也可以顯示成/usr/bin/false
,一般都會選擇/bin/bash
作為使用者啟動的shell,像是rockylinux就是一個一般使用者的資訊:rockylinux:x:1000:1000:rockylinux:/home/rockylinux:/bin/bash
。從簡單的意思上來說,使用者多了之後,可以把使用者做一個分組,那這個組可以視為一個群體,那就可以稱做群組,通常會有群組的出現是因為,有些功能上在存取目錄或是檔案需要用群組來指定分享,那用群體的方式指定會比逐一一個使用者指定來的方便與有效率,而有關於群組的資訊會存放在/etc/group
之檔案裡面,而/etc/gshadow
則是存放有關於群組的一些雜湊過的資訊,在/etc/group
之檔案中,會用冒號將每個區塊的資訊隔開,以下列的群組資訊為例:
groupl:x:10:user1,user2,user3
從上述的群組資訊來看,由左至右的解釋如下:
group1
指的是群組的名稱。gshadow
啟用的時候,這裡的欄位永遠都是x
。10
代表的是群組的id,即group id的意思。一個使用者可以在多個群組中出現,主要群組就是指每個使用者都有一個相同名稱的群組,而在其他非與使用者相同名字的群組則是指次要群組。這個可以從id
這個指令看的出來:
[rockylinux@workstation ~]$ id
uid=1000(rockylinux) gid=1000(rockylinux) groups=1000(rockylinux),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
從上面輸出的訊息中,groups
這個地方裡面有兩個群組,第一個群組與rockylinux
這個使用者相同,即主要群組,而之後以逗號隔開的每個群組都是次要群組,以上述輸出的訊息為例,次要群組則為wheel
這個群組。
在上面的幾個小節中都有提到使用者與群組的密碼都分別存放在/etc/shadow
與/etc/gshadow
之檔案裡面,而檔案存放的格式以雜湊過的字串為主,相關的檔案,如/etc/shadow
之輸出如下:
[rockylinux@workstation ~]$ su - root
Password:
[root@workstation ~]#
[root@workstation ~]# cat /etc/shadow
root:$6$P1ovT7ZGnrywqhIl$zDuaMQBGwMmtCvDLnmeViQYXG4DU3S25zqWoX5Wos5uVsaBbLfnNYqDs0iHOE3OkT0lsIfnBJCpbnKuIloUbk0::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::
adm:*:18700:0:99999:7:::
lp:*:18700:0:99999:7:::
sync:*:18700:0:99999:7:::
shutdown:*:18700:0:99999:7:::
halt:*:18700:0:99999:7:::
mail:*:18700:0:99999:7:::
operator:*:18700:0:99999:7:::
games:*:18700:0:99999:7:::
ftp:*:18700:0:99999:7:::
nobody:*:18700:0:99999:7:::
dbus:!!:18887::::::
systemd-coredump:!!:18887::::::
systemd-resolve:!!:18887::::::
tss:!!:18887::::::
polkitd:!!:18887::::::
geoclue:!!:18887::::::
rtkit:!!:18887::::::
pipewire:!!:18887::::::
pulse:!!:18887::::::
libstoragemgmt:!!:18887::::::
qemu:!!:18887::::::
clevis:!!:18887::::::
usbmuxd:!!:18887::::::
unbound:!!:18887::::::
gluster:!!:18887::::::
rpc:!!:18887:0:99999:7:::
avahi:!!:18887::::::
setroubleshoot:!!:18887::::::
saslauth:!!:18887::::::
dnsmasq:!!:18887::::::
radvd:!!:18887::::::
sssd:!!:18887::::::
cockpit-ws:!!:18887::::::
cockpit-wsinstance:!!:18887::::::
chrony:!!:18887::::::
flatpak:!!:18887::::::
colord:!!:18887::::::
rpcuser:!!:18887::::::
gdm:!!:18887::::::
gnome-initial-setup:!!:18887::::::
sshd:!!:18887::::::
tcpdump:!!:18887::::::
rockylinux:$6$5EddOY.CFXScF6wK$yb3Y2wvppSaRcW199JYfEhltc5CkEMgx/3FljbuxS4zpBj.8deBFjMzf03q8dIJWagePqjWe7lwxIRzEN4Tfn0:18889:0:99999:7:::
從上面的輸出訊息可以知道,這兩個存放密碼檔案一般來說只能是最高權限使用者才可以進行存取,因此需要先切換成最高權限使用者的帳號之後,再使用cat
指令進行相關的檔案輸出,可以發現到密碼的字串皆以湊的方式表示,而可以使用pwconv
指令將/etc/passwd
檔案的密碼搬到/etc/shadow檔案中,而pwunconv
則是相反,將/etc/shadow檔案中儲存的密碼搬到/etc/passwd
並刪除/etc/shadow
檔案,則可以得到下列的輸出:
[root@workstation ~]# pwunconv
[root@workstation ~]# cat /etc/passwd
root:$6$P1ovT7ZGnrywqhIl$zDuaMQBGwMmtCvDLnmeViQYXG4DU3S25zqWoX5Wos5uVsaBbLfnNYqDs0iHOE3OkT0lsIfnBJCpbnKuIloUbk0:0:0:root:/root:/bin/bash
bin:*:1:1:bin:/bin:/sbin/nologin
daemon:*:2:2:daemon:/sbin:/sbin/nologin
adm:*:3:4:adm:/var/adm:/sbin/nologin
lp:*:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:*:5:0:sync:/sbin:/bin/sync
shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
halt:*:7:0:halt:/sbin:/sbin/halt
mail:*:8:12:mail:/var/spool/mail:/sbin/nologin
operator:*:11:0:operator:/root:/sbin/nologin
games:*:12:100:games:/usr/games:/sbin/nologin
ftp:*:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:*:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:!!:81:81:System message bus:/:/sbin/nologin
systemd-coredump:!!:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:!!:193:193:systemd Resolver:/:/sbin/nologin
tss:!!:59:59:Account used for TPM access:/dev/null:/sbin/nologin
polkitd:!!:998:996:User for polkitd:/:/sbin/nologin
geoclue:!!:997:995:User for geoclue:/var/lib/geoclue:/sbin/nologin
rtkit:!!:172:172:RealtimeKit:/proc:/sbin/nologin
pipewire:!!:996:992:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
pulse:!!:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
libstoragemgmt:!!:995:989:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
qemu:!!:107:107:qemu user:/:/sbin/nologin
clevis:!!:994:988:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/sbin/nologin
usbmuxd:!!:113:113:usbmuxd user:/:/sbin/nologin
unbound:!!:993:987:Unbound DNS resolver:/etc/unbound:/sbin/nologin
gluster:!!:992:986:GlusterFS daemons:/run/gluster:/sbin/nologin
rpc:!!:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
avahi:!!:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
setroubleshoot:!!:991:984::/var/lib/setroubleshoot:/sbin/nologin
saslauth:!!:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin
dnsmasq:!!:983:983:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
radvd:!!:75:75:radvd user:/:/sbin/nologin
sssd:!!:982:982:User for sssd:/:/sbin/nologin
cockpit-ws:!!:981:980:User for cockpit web service:/nonexisting:/sbin/nologin
cockpit-wsinstance:!!:980:979:User for cockpit-ws instances:/nonexisting:/sbin/nologin
chrony:!!:979:978::/var/lib/chrony:/sbin/nologin
flatpak:!!:978:977:User for flatpak system helper:/:/sbin/nologin
colord:!!:977:976:User for colord:/var/lib/colord:/sbin/nologin
rpcuser:!!:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
gdm:!!:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:!!:976:975::/run/gnome-initial-setup/:/sbin/nologin
sshd:!!:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:!!:72:72::/:/sbin/nologin
rockylinux:$6$PPjj5FZ1HiJa1Wsl$9SIRj2kUaBoHrwKUILn7id1EdlKGI0BR3NV4gMlfmCY5qTuR2Fp5wx2lS1J1JCeboIV1HC8MadwHmDpHEGYaA1:1000:1000:rockylinux:/home/rockylinux:/bin/bash
[root@workstation ~]# ls /etc/shadow
ls: cannot access '/etc/shadow': No such file or directory
從上述的訊息輸出可以發現所有的雜湊密碼都搬到/etc/passwd
檔案了,請注意!筆者是為了要展示這個密碼儲存的原理,在實務上請不要使用pwunconv
並確保密碼儲存在/etc/shadow
檔案裡面,原因是/etc/passwd
只要是正常的一般使用者皆可以讀取,雜湊的密碼容易受到字典攻擊而遭到破解,因此在實務上都會使用pwconv
指令將密碼存放到/etc/shadow
中,預設作業系統也是這樣做,同樣的,group群組的gshadow之grpconv
與grpunconv
也有一樣的效果,這邊筆者就不多做說明了。
前面的幾個小章節有提到雜湊,那雜湊是什麼?筆者使用下列的小圖示來做說明:
從上面的圖示可以知道,當輸入明文:rockylinux時候,經過SHA-512這個演算法雜湊之後的結果會得到***
,這邊先以這樣的字串表示計算後的結果,那上述的整個一系列過程,就稱為雜湊。
rockylinux
使用者所在的群組有哪些。rockylinux
使用者有關的資訊,如user id、開始的shell等。